﻿/*************************************************************************************

- CLR版本：        4.0.30319.42000
- 类 名 称：       Loader
- 机器名称：       YTE
- 命名空间：       LD.Host
- 文 件 名：       Loader
- 创建时间：       2022/6/10 11:33:42
- 作    者：       YTE
- 说   明：
- 修改时间：
- 修 改 人：
  *************************************************************************************/

using LD.BC;
using LD.Vision;
using System;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using YTE.Control;

namespace LD.Host
{
    public static class AppLoader
    {

        #region 初始化
        public static void InitUser()
        {
            Appbus.User.Load();
            Appbus.User.CurrentUser = new TB_User()
            {
                Name = UserType.操作工.ToString()
            };
        }

        /// <summary>
        /// 初始化参数
        /// </summary>
        public static void InitVariable()
        {
            InitSystem();
        }
        private static void InitSystem()
        {
            bool success = Cache.LoadCache();
            if (!success)
            {
                Cache.SetCache(CONST.PARTNO, "LD");
                Cache.SetCache(CONST.VISION, false);
                Cache.SetCache(CONST.BC, false);
                Cache.SetCache(CONST.MES, false);
                Cache.SetCache(CONST.夏普, false);
                Cache.SetCache(CONST.蓝思, false);
                Cache.SetCache(CONST.光弘, false);
                Cache.SetCache(CONST.华勤, false);
                Cache.SetCache(CONST.BYD, false);
                Cache.SetCache(CONST.朵唯, false);
                Cache.SetCache(CONST.富士康, false);
                Cache.SetCache(CONST.东莞德普特, false);

            }

            Appbus.Wip.Init();
            Cache.SaveCache();
        }
        #endregion

        #region 加载
        public static void LoadPartNo()
        {
            Appbus.PartNo.CurrentPartNo = (string)Cache.GetCache(CONST.PARTNO);
            if (Appbus.PartNo.CurrentPartNo == null)
                Appbus.PartNo.CurrentPartNo = "LD";

        }
        public static void LoadHD()
        {
            CommunicateFactory.Instance.Init();
        }
        public static void LoadBc()
        {
            try
            {
                if (!(bool)Cache.GetCache(CONST.BC))
                    return;

                Cache.SetCache(CONST.BC_SOUND, true);
                Cache.SetCache(CONST.BC_ISRESET, false);
                Cache.SetCache(CONST.BC_ISRESETING, false);
                Cache.SetCache(CONST.BC_ERRORING, false);

                //板卡品牌信息
                BcFactory.Instance.Load();
            }
            catch (Exception ex)
            {
                FormSysMessage.ShowException(ex);
            }
        }
        public static void LoadCCD()
        {
            try
            {
                if (!(bool)Cache.GetCache(CONST.VISION))
                    return;
                //if (!Directory.Exists(Path.Combine(Appbus.BasePath, "Vision\\Calibration\\Board")))
                //    Directory.CreateDirectory(Path.Combine(Appbus.BasePath, "Vision\\Calibration\\Board"));
                ////配置文档
                //VisionFactory.Instance.Config = (VisionConfig)Cache.GetCache(CONST.BC_CONFIG);
                //if (VisionFactory.Instance.Config == null)
                //    VisionFactory.Instance.Config = new VisionConfig();

                //相机屏蔽
                //CameraFactory.Instance.CameraList.Add("v1", new CameraVirtual("v1"));
                CameraFactory.Instance.CameraBrand = CameraType.海康;
            }
            catch (Exception ex)
            {
                FormSysMessage.ShowException(ex);
            }
        }
        public static void LoadJob()
        {
            //日志删除
            string CronTime = "0 50 19 * * ? ";
            //QuartzUtil.AddJob<DeleteDBJob>("DeleteDBJob", CronTime);
        }
        public static void LoadFlow(FlowType flowType)
        {
            //Log4.Info($"执行{flowType}");
            var flows = Appbus.PartNo.Config?.Flow.Where(p => p.FlowType == (int)flowType).OrderBy(p => p.Sort).ToList();
            foreach (var item in flows)
            {
                foreach (var tool in item.Tools)
                {
                    if (tool.Enabled)
                    {
                        var opResult = FlowHelper.Execute(tool);
                        if (!opResult.IsSuccess)
                            break;
                    }
                }
            }
        }
        #endregion

        #region 关闭
        public static void Closed()
        {
            /*在FPC项目中出现关机导致的文件丢失问题
             * 特屏蔽此处，后续再观察，
            */
            //机种配置保存
            //Appbus.PartNo.Save();
            //通讯保存
            //CommunicateFactory.Instance.Save();
            //缓存保存
            Cache.SaveCache();
            //flow停止
            FlowHelper.StopAll();
            //执行关闭流程
            LoadFlow(FlowType.关闭项);
            //通讯关闭
            CommunicateFactory.Instance.Stop();

            CloseBc();

            CloseCCD();

            Task.Delay(1000).Wait();
        }
        private static void CloseBc()
        {
            if ((bool)Cache.GetCache(CONST.BC))
            {
                //BcFactory.Instance?.Closed();
                //BcFactory.StartStop.Closed();
            }

            Console.WriteLine("板卡正常关闭");
        }
        private static void CloseCCD()
        {
            try
            {
                if ((bool)Cache.GetCache(CONST.VISION))
                {
                    foreach (var item in CameraFactory.Instance.CameraList)
                    {
                        item.Value.TriggerMode = false;
                        item.Value.StopGrab();
                        item.Value.Close();
                    }
                }

                Console.WriteLine("视觉正常关闭");
            }
            catch (Exception)
            {
            }
        }
        #endregion
    }
}
